#include <string.h> //字符串操作函数，例如 strcpy, strlen, strcmp。
#include <stdio.h>  //标准输入输出函数，例如 printf, scanf, fopen, fread。
#include <stdlib.h> //动态内存分配、进程控制，例如 malloc, free, exit。
#include <stdint.h>
#include <stdbool.h>
#include <fcntl.h>     //文件控制和操作，例如 open, fcntl, creat
#include <sys/wait.h>  //进程等待函数，例如 wait, waitpid。
#include <sys/ioctl.h> //I/O控制命令，例如 ioctl。
#include <sys/types.h> //定义数据类型，例如 pid_t, off_t。
#include <unistd.h>    //POSIX 标准 API，例如 fork, exec, read, write。
#include <math.h>      //数学函数，例如 sin, cos, sqrt, pow
#include <errno.h>     //定义全局变量 errno 和错误代码。
#include <assert.h>    //运行时断言检查，例如 assert()。
#include <ctype.h>     //字符分类和转换，例如 isalpha, isdigit, toupper

#include <pthread.h>   //POSIX线程库，例如 pthread_create, pthread_mutex_lock。
#include <semaphore.h> //信号量，例如 sem_init, sem_wait, sem_post。

#include <sys/socket.h> //套接字接口，例如 socket, connect, bind。
#include <netinet/in.h> //Internet地址族，例如 sockaddr_in。
#include <arpa/inet.h>  //网络地址转换，例如 inet_pton, inet_ntoa。
#include <netdb.h>      //网络数据库操作，例如 gethostbyname, getaddrinfo。

#include <poll.h>         //poll接口
#include <sys/select.h>   //select接口
#include <sys/epoll.h>    //epoll接口
#include <sys/shm.h>      //共享内存
#include <sys/msg.h>      // 消息队列
#include <sys/ipc.h>      //System V IPC的键生成。
#include <sys/mman.h>     //内存映射,例如 mmap, munmap。
#include <signal.h>       //信号处理，例如 signal, sigaction, kill
#include <endian.h>       //主机字节序和网络字节序转换，例如 htons, ntohl。
#include <sys/random.h>   //随机数生成，例如 getrandom。
#include <linux/limits.h> //系统限制，例如路径长度 PATH_MAX。

#include <syslog.h> //日志记录，例如 syslog, openlog。

// ANSI and POSIX functions

void *func1(void *arg)
{
    int *sum = malloc(sizeof(int));
    int temp = *(int *)arg;
    *sum = 0;

    for (int i = 0; i <= 100; i++)
    {
        *sum += i;
    }

    printf("sum is %d, arg is %d\n", *sum, temp);
    pthread_t pt = pthread_self();

    printf("pthread id is 0x%lx\n", pt);

    pthread_exit(sum);
}
/// @brief pthread_example
/// @return errorcode
/// int pthread_create(pthread_t *__restrict__ __newthread, const pthread_attr_t *__restrict__ __attr,
/// void *(*__start_routine)(void *), void *__restrict__ __arg)

int pthread_example()
{
    pthread_t p[10];
    pthread_attr_t pa;

    int temp[10] = {0};
    void *retval[10];

    pthread_attr_init(&pa);

    for (int i = 0; i < 10; i++)
    {
        temp[i] = i + 10;
        if (pthread_create(&p[i], &pa, func1, (void *)&temp[i]) != 0)
        {
            fprintf(stderr, "pthread_create failed\n");
            return -1;
        }
    }
    for (int i = 0; i < 10; i++)
    {
        pthread_join(p[i], &retval[i]);
        // 这里接受是一个2级指针，理解的化就当作是指向void*的指针，传入void*是为了方便泛化
        printf("get result:%d\n", *(int *)retval[i]);
        free(retval[i]);
    }

    pthread_attr_destroy(&pa);

    return 0;
}

int main(int argc, char **argv)
{
    pthread_example();

    exit(0);
}